home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / PRINTERS / PrintPreviewer.C < prev   
C/C++ Source or Header  |  1992-07-09  |  4KB  |  192 lines

  1. #include "PrintManager.h"
  2.  
  3. #include "Class.h"
  4. #include "String.h"
  5. #include "Scroller.h"
  6. #include "Expander.h"
  7. #include "Window.h"
  8. #include "WindowPort.h"
  9. #include "WindowSystem.h"
  10. #include "PrintPort.h"
  11. #include "BorderItems.h"
  12. #include "Buttons.h"
  13. #include "Printer.h"
  14. #include "PictPort.h"
  15. #include "Picture.h"
  16. #include "PictureItem.h"
  17.  
  18.  
  19. //---- PreviewPageItem ---------------------------------------------------------
  20.  
  21. class PreviewPageItem : public PictureItem {
  22. public:
  23.     MetaDef(PreviewPageItem);
  24.     PreviewPageItem() : PictureItem((Picture*)0)
  25.     { }
  26.     void SetPicture(Picture *bm, bool redraw= TRUE);
  27.     Metric GetMinSize();
  28.     void Draw(Rectangle);
  29. };
  30.  
  31. NewMetaImpl0(PreviewPageItem, PictureItem);
  32.  
  33. Metric PreviewPageItem::GetMinSize()
  34. {
  35.     return (gPrintManager->GetPaperSize()+30)*4/4;
  36. }
  37.  
  38. void PreviewPageItem::Draw(Rectangle)
  39. {
  40.     if (pic) {
  41.     GrState st;
  42.     GrScale(4.0/4.0, 4.0/4.0);
  43.     GrTranslate(15);
  44.     
  45.     Rectangle rr(gPrintManager->GetPaperSize());
  46.     DrawShadow(rr, gPoint6, gInkWhite, gInkBlack);
  47.  
  48.     GrSetPenNormal();
  49.     GrSetPenInk(ePatGrey50);
  50.     GrStrokeRect(gPrintManager->GetViewRect());
  51.     GrStrokeRect(gPrintManager->GetPrintRect());
  52.     GrSetPenNormal();
  53.  
  54.     GrShowPicture(pic->BBox(), pic);
  55.     }
  56. }
  57.  
  58. //---- PreviewDialog -----------------------------------------------------------
  59.  
  60. const int cIdStop   = cIdFirstUser + 100,
  61.       cIdNext   = cIdFirstUser + 101;
  62.  
  63. class PreviewDialog : public Dialog {
  64. public:
  65.     bool next, stop;
  66.     TextItem *ti;
  67.     PictureItem *pi;
  68. public:
  69.     PreviewDialog() : Dialog("Print Preview", eWinDefault)
  70.     { }
  71.     VObject *DoMakeContent();
  72.     void Control(int id, int part, void *val);
  73.     void Show();
  74.     void SetPicture(Picture *pict);
  75.     void SetStatus(char *msg);
  76. };
  77.  
  78. void PreviewDialog::Show()
  79. {
  80.     next= stop= FALSE;
  81.     ShowAt(gWindow, gWindow->contentRect.Center());
  82. }
  83.  
  84. void PreviewDialog::SetStatus(char *msg)
  85. {
  86.     if (ti) {
  87.     ti->SetString(form("Status: %s", msg), TRUE);
  88.     ti->UpdateEvent();
  89.     }
  90. }
  91.  
  92. void PreviewDialog::SetPicture(Picture *pict)
  93. {
  94.     next= stop= FALSE;
  95.     if (pict) {
  96.     pi->SetPicture(pict, TRUE);
  97.     ti->UpdateEvent();
  98.     }
  99. }
  100.  
  101. VObject *PreviewDialog::DoMakeContent()
  102. {
  103.     pi= new PreviewPageItem;
  104.  
  105.     Scroller *scr= new Scroller(pi, gPrintManager->GetPaperSize()*2/3);
  106.     scr->SetBgInk(ePatGrey50);
  107.     
  108.     VObject *v=
  109.     new HExpander(gPoint10,
  110.         new ActionButton(cIdNext, "Next"),
  111.         new ActionButton(cIdStop, "Stop"),
  112.         ti= new TextItem("Status:                             "),
  113.         0
  114.     );
  115.     v->SetFlag(eVObjHFixed|eVObjVFixed);
  116.  
  117.     return new VExpander(gPoint2, v, scr, 0);
  118. }
  119.  
  120. void ExitLoop()
  121. {
  122.     if (WindowSystem::grabport)
  123.     WindowSystem::grabport->ExitLoop();
  124. }
  125.  
  126. void PreviewDialog::Control(int id, int part, void *val)
  127. {
  128.     if (id == cIdStop) {
  129.     stop= TRUE;
  130.     ExitLoop();
  131.     } else if (id == cIdNext) {
  132.     next= TRUE;
  133.     ExitLoop();
  134.     } else
  135.     Dialog::Control(id, part, val);
  136. }
  137.  
  138. //---- Preview -----------------------------------------------------------------
  139.  
  140. class Preview : public Printer {
  141.     PreviewDialog *previewDialog;
  142.     PictPort *pictPort;
  143.     int pagecnt;
  144. public:
  145.     MetaDef(Preview);
  146.     Preview()
  147.     { }
  148.     ~Preview()
  149.     { SafeDelete(previewDialog); }
  150.     char *GetName()
  151.     { return "Preview"; }
  152.     bool CanPrint()
  153.     { return TRUE; }
  154.     PrintPort *MakePrintPort(char*)
  155.     { return pictPort= new PictPort(new Picture); }
  156.     void Start(int pagecnt);
  157.     bool OpenPage(int pageno, Rectangle pgr);
  158.     bool ClosePage();
  159.     void Finish();
  160.     PrinterSettings *GetSettings()
  161.     { return gPrintManager->currSettings; }
  162. };
  163.  
  164. NewMetaImpl0(Preview, Printer);
  165.  
  166. void Preview::Start(int pc)
  167. {
  168.     pagecnt= pc;
  169.     previewDialog= new PreviewDialog;
  170.     previewDialog->Show();
  171. }
  172.  
  173. bool Preview::OpenPage(int pageno, Rectangle)
  174. {
  175.     previewDialog->SetStatus(form("Page %d of %d", pageno, pagecnt));
  176.     return FALSE;
  177. }
  178.  
  179. bool Preview::ClosePage()
  180. {
  181.     previewDialog->SetPicture(pictPort->GetPicture());
  182.     ((WindowPort*) previewDialog->GetWindow()->GetPortDesc())->GrabLoop();
  183.     return previewDialog->stop;
  184. }
  185.     
  186. void Preview::Finish()
  187. {
  188.     previewDialog->Close();
  189. }
  190.  
  191.  
  192.